"""生成器及反射机制与原理"""
def func():
    print(1)
    print(2)
    print(3)
    print(4)
    print(5)
    yield 6
    print(7)
    print(8)
    yield 9


fn = func()  # 生成器
print("第一次调用生成器")
num = next(fn)  # 通过next(迭代器)，生成器是迭代器的一种
print(f"yield返回值：{num}")
print("第二次调用生成器")
num2 = next(fn)
print(f"yield返回值：{num2}")


# 反射机制与原理
class A:
    o = 888

    def __init__(self):
        self.i = 666

    def a(self):
        print("a方法被调用啦！")

    def b(self):
        print("b方法被调用啦！")

    def c(self):
        print("c方法被调用啦！")

    def d(self):
        print("d方法被调用啦！")

    @classmethod
    def e(cls):
        print("e方法")


x = A()
setattr(x, "w", print)  # (对象，对象的方法名，引用的函数)
x.w("A类新增了一个w实例方法")
# 使用内建函数hasattr()判断对象是否存在该类属性及实例属性或者类方法和实例方法
print(hasattr(x, "w"))  # True
delattr(x, "w")  # 只能删除实例属性
# x.w("A类新增了一个w实例方法")
print(hasattr(x, "w"))  # False
getattr(x, "d")()  # d方法被调用啦！
